package cn.wuyi.common.rest;


import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

/**
 * @类功能说明:   封装了请求URL，采用Fluent风格操作url，组合url,采用put().put().put()；删除url： remove().remove()
 * 将对象转化为字符串： getUrl();
 * @公司名称     :中企动力
 * @作者                ：ce 
 * @创建时间      ：2015年8月26日 上午11:18:39  
 * @版本                ：V1.0
 */
public class RestUrl implements Cloneable{
	
	//存储url参数的key,格式：key={key}
	private List<String> paramKeyList = new LinkedList<String>();
	
	private String url;
	
	public RestUrl(String url){
		this.url = url;
	}
	
	/**
	 * 
	 * @方法功能说明：组合url，采用fluent分隔的API方式，如： put().put().put()
	 * @作者        : ce
	 * @创建时间    ：2015年8月26日 下午2:17:27 
	 * @param subpath
	 * @return
	 */
	public synchronized RestUrl put(String subpath){
		if(StringUtils.isEmpty(subpath)){
			return this;
		}
		if(subpath.contains("/")){
			throw new IllegalStateException("url path parameter can not include / ,current value : "+subpath);
		}
		paramKeyList.add(subpath);
		return this;
	}
	
	public RestUrl putParameter(Map<String,?> parameter){
		if(parameter != null && parameter.size() > 0){
			Set<String> keys = parameter.keySet();
			for(String key : keys){
				put(key+"="+"{"+key+"}");
			}
		}
		return this;
	}
	
	/**
	 * @方法功能说明：删除某个路径,采用fluent分隔的API方式，如： put().put().put()
	 * @作者        : ce
	 * @创建时间    ：2015年8月26日 下午2:18:35 
	 * @param subpath
	 * @return
	 */
	public synchronized RestUrl remove(String subpath){
		if(StringUtils.isEmpty(subpath)){
			return this;
		}
		paramKeyList.remove(subpath);
		return this;
	}
	
	public String getUrl(){
		if(paramKeyList.isEmpty()){
			return this.url;
		}else{
			StringBuilder urlSb = new StringBuilder(this.url);
			for(String paramKey : paramKeyList){
				if(paramKey.contains("=")){
					if(urlSb.toString().contains("?")){
						if(urlSb.toString().endsWith("&")){
							urlSb.append(paramKey);
						}else{
							urlSb.append("&").append(paramKey);
						}
					}else{
						urlSb.append("?").append(paramKey);
					}
				}else{
					if(urlSb.toString().endsWith("/")){
						urlSb.append(paramKey);
					}else{
						urlSb.append("/").append(paramKey);
					}
				}
			}
			return urlSb.toString();
		}
	}
}
